#ifndef _COMMON_IIC_H
#define _COMMON_IIC_H
/*============================================================================
 iic面向硬件对象的通用基础驱动
 包括基础的起始信号、结束信号、ack、等待ack、收发字节

 通过IIC_DEV_LINE_CNT确定iic设备个数(不同线，同线可通过地址区分)
 通过T_common_iic_line数组注册sda、scl两个引脚的操作
 上层通过common_iic进行iic基础操作，从而完成确定芯片的驱动
 ============================================================================*/

#include <stdint.h>

#define IIC_FALSE       0
#define IIC_TRUE        1

//iic设备硬件个数
#define IIC_DEV_LINE_CNT                            1

typedef enum{
    eIIC_1 = 0,
}E_iic_line_nbr;                                    //iic设备硬件序号

typedef struct{
    void (*sda_out)();                              //配置sda输出
    void (*sda_in)();                               //配置sda输入
    void (*sda_l)();                                //sda低
    void (*sda_h)();                                //sda高
    uint8_t (*sda_state)();                         //读sda电平
    void (*scl_l)();                                //scl低
    void (*scl_h)();                                //scl高
}T_common_iic_line;                                 //通用iic硬件接口

typedef struct{
    const T_common_iic_line * const pHw;            //硬件接口指针 
    const uint8_t lineCnt;                          //硬件接口个数

    void (*dlyUs)(uint16_t us);                     //us延时
    void (*start)(uint8_t line);                    //开始
    void (*stop)(uint8_t line);                     //停止
    void (*send_ack)(uint8_t line,uint8_t type);    //发送ack  type：1发送   0不发送
    uint8_t (*wait_ack)(uint8_t line);              //等待ack
    void (*send_byte)(uint8_t line,uint8_t val);    //发送字节
    uint8_t (*rev_byte)(uint8_t line);              //接收字节
}T_common_iic;                                      //通用IIC接口
                                                    //通过T_common_iic_hw指向硬件接口数组
                                                    //每个指令通过line变量区分不同硬件接口

extern const T_common_iic common_iic;

#endif